#pragma once

#include <stdio.h>
#include <stdlib.h>

typedef enum Boolean {
    True = 1, False = 0
} Boolean;

typedef enum Status {
    Error = -1, Success = 0
} Status;

#define NOTHING (-1)

#define L_PURPLE printf("\e[1;35m");
#define BROWN printf("\e[0;33m");
#define COLOR_RESET printf("\033[0m");

#define DEBUG_MODE 1

#define PRINT_AND_EXIT(msg)                     \
    puts(msg);                                  \
    exit(1);

// 如果为空则退出
#define EXIT_IF_NULL(content, msg)              \
    if (content == NULL) {                      \
        puts(msg);                              \
        exit(1);                                \
    }

// 如果为真则退出
#define EXIT_IF_TRUE(condition, msg)            \
    if (condition) {                            \
        puts(msg);                              \
        exit(1);                                \
    }

// 如果为真则退出
#define CONTINUE_IF_TRUE(condition, msg)        \
    if (condition) {                            \
        puts(msg);                              \
        continue;                               \
    }

#define RETURN_IF_TRUE(condition, result)       \
    if (condition) {                            \
        return result;                          \
    }

#define FREE_AND_SET_NULL(ptr)                  \
    if (ptr != NULL) {                          \
        free(ptr);                              \
        ptr = NULL;                             \
    }

#define DEBUG_BEGIN(topic)                      \
    if (DEBUG_MODE) {                           \
        L_PURPLE                                \
        printf("\n=========begin(%s)=========\n", topic);

#define DEBUG_END                               \
        puts("=========end=========\n");        \
        COLOR_RESET                             \
    }

static int Min(int a, int b) {
    return a > b ? b : a;
}